import os
import subprocess
import sys
from typing import Optional, List, Dict

def launch_windows_app(
        parent,
        app_path: str,
        args: Optional[List[str]] = None,
        wait: bool = False,
        working_dir: Optional[str] = None,
        env_vars: Optional[Dict[str, str]] = None,
        elevated: bool = False,
) -> None:
    """
    在 Windows 平台启动应用程序的增强函数

    参数:
        app_path: 应用程序路径或命令
        args: 传递给应用程序的参数列表
        wait: 是否等待应用程序完成
        working_dir: 应用程序的工作目录
        env_vars: 环境变量字典
        elevated: 是否以管理员权限启动

    返回:
        应用程序的进程对象 (如果 wait=False) 或返回码 (如果 wait=True)
    """
    upg = parent
    try:
        # 构建命令
        cmd = [app_path]
        if args:
            cmd.extend(args)

        # 准备启动参数
        start_info = subprocess.STARTUPINFO()
        start_info.dwFlags |= subprocess.STARTF_USESHOWWINDOW

        # 处理管理员权限
        if elevated:
            if not sys.platform.startswith('win'):
                raise RuntimeError("提升权限功能仅在 Windows 上可用")
            import ctypes
            if ctypes.windll.shell32.IsUserAnAdmin() == 0:
                print("请求管理员权限...")
                ctypes.windll.shell32.ShellExecuteW(
                    None, "runas", sys.executable, " ".join(sys.argv), None, 1
                )
                return

        # 启动应用程序
        # print(f'cur dir {os.path.curdir} working_dir {working_dir}')
        process = subprocess.Popen(
            cmd,
            startupinfo=start_info,
            cwd=working_dir,
            env={**os.environ, **(env_vars or {})},
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True
        )

        # 等待应用程序完成 (如果需要)
        if wait:
            stdout, stderr = process.communicate()
            return_code = process.returncode
            if return_code != 0:
                print(f"应用程序返回错误码: {return_code}")
                if stderr:
                    print(f"错误输出: {stderr.strip()}")
            else:
                print(f"应用程序成功执行，返回码: {return_code}")
            upg.dialog_close.emit()
            return return_code
        else:
            print(f"应用程序已启动，进程 ID: {process.pid}")
            upg.dialog_close.emit()
            return process

    except FileNotFoundError:
        print(f"错误: 找不到应用程序 - {app_path}")
    except PermissionError:
        print(f"错误: 权限不足，无法启动应用程序 - {app_path}")
    except subprocess.SubprocessError as e:
        print(f"错误: 启动应用程序失败 - {e}")
    except Exception as e:
        print(f"未知错误: {e}")
    upg.dialog_close.emit()
    return None